package com.taskflow.mapper;

import com.taskflow.dto.EntryQueryDTO;
import com.taskflow.entity.EntryData;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;

/**
 * 关单数据Mapper
 */
@Mapper
public interface EntryDataMapper {
    
    int insert(EntryData entryData);
    
    int batchInsert(List<EntryData> list);
    
    EntryData selectByEntryId(String entryId);
    
    /**
     * 查询报关单的所有明细
     */
    List<EntryData> selectByEntryIdWithDetails(String entryId);
    
    List<EntryData> selectList(EntryQueryDTO query);
    
    Long selectCount(EntryQueryDTO query);
    
    boolean existsByEntryId(String entryId);
    
    /**
     * 检查关单明细是否存在
     * @param entryId 报关单号
     * @param gNo 商品序号
     */
    boolean existsByEntryIdAndGNo(@Param("entryId") String entryId, @Param("gNo") String gNo);
    
    /**
     * 根据任务条件查询关单数据（模拟从外部数据源下载）
     */
    List<EntryData> selectByTaskConditions(Map<String, Object> conditions);

    /**
     * 根据海关代码查询海关名称
     */
    String getCustomsNameByCode(@Param("customsCode") String customsCode);
    
    /**
     * 根据运输方式代码查询运输方式名称
     */
    String getTransfNameByCode(@Param("transfCode") String transfCode);
    
    /**
     * 根据贸易方式代码查询贸易方式名称
     */
    String getTradeNameByCode(@Param("tradeCode") String tradeCode);
    
    /**
     * 1. 根据征免性质代码查询征免性质名称（C_Levytype.AbbrCut）
     */
    String getCutNameByCode(@Param("cutMode") String cutMode);
    
    /**
     * 2. 根据贸易国家代码查询国家名称（C_Country.CountryName）
     */
    String getTradeCountryNameByCode(@Param("tradeCountry") String tradeCountry);
    
    /**
     * 3. 根据成交币制代码查询币制名称（C_Curr.CurrName）
     */
    String getTradeCurrNameByCode(@Param("tradeCurr") String tradeCurr);
    
    /**
     * 4. 根据成交方式代码查询成交方式名称（C_Transac.TransSpec）
     */
    String getTransModeNameByCode(@Param("transMode") String transMode);
    
    /**
     * 5. 根据包装种类代码查询包装名称（C_WrapType.WrapName）
     */
    String getWrapTypeNameByCode(@Param("wrapType") String wrapType);
    
    /**
     * 6. 根据贸易国代码查询国家名称（C_Country.CountryName）
     */
    String getTradeAreaNameByCode(@Param("tradeAreaCode") String tradeAreaCode);
    
    /**
     * 7. 根据原产国代码查询国家名称（C_Country.CountryName）
     */
    String getOriginCountryNameByCode(@Param("originCountry") String originCountry);
    
    /**
     * 8. 根据装货港代码查询港口名称（C_PortLine.PortCCode）
     */
    String getDistinatePortNameByCode(@Param("distinatePort") String distinatePort);
    
    /**
     * 9. 根据境内目的地代码查询地区名称（C_District.DistrictName）
     */
    String getDistrictNameByCode(@Param("districtCode") String districtCode);
    
    /**
     * 10. 根据征免方式代码查询征免方式名称（C_Levymode.DutySpec）
     */
    String getDutyModeNameByCode(@Param("dutyMode") String dutyMode);
    
    /**
     * 11. 根据单位代码查询单位名称（C_Unit.UnitName）
     */
    String getUnitNameByCode(@Param("unitCode") String unitCode);
    
    /**
     * 12. 根据入境口岸/离境口岸代码查询口岸名称（C_EntryPort.entryPortName）
     */
    String getEntryPortNameByCode(@Param("entryPortCode") String entryPortCode);
}

